<?php
declare (strict_types=1);

/**
 * 整理菜单树方法
 */
function prepareMenu($param, $pid = 1)
{
    $parent = []; //父类
    $child = [];  //子类
    foreach ($param as $key => $vo) {
        if ($vo['pid'] == $pid) {
            $vo['href'] = '#';
            $parent[] = $vo;
        } else {
            $vo['href'] = strstr($vo['name'], '/') ? url($vo['name'])->build() : url($vo['name'] . '/index')->build();
            $child[] = $vo;
        }
    }
    foreach ($parent as $key => $vo) {
        foreach ($child as $k => $v) {

            if ($v['pid'] == $vo['id']) {

                $parent[$key]['child'][] = $v;
            }

        }
    }
    unset($child);

    return $parent;
}

function getCount($fetchSql)
{
    $fetchSql = "SELECT count(*) as tp_count " . strstr($fetchSql, "FROM");

    return \think\facade\Db::query($fetchSql)[0]['tp_count'];
}

function queryIp($ip)
{
    $url = "http://whois.pconline.com.cn/jsFunction.jsp?ip=" . $ip;
    $ch = curl_init();
    //设置选项，包括URL
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    //执行并获取HTML文档内容
    $output = curl_exec($ch);
    //释放curl句柄
    curl_close($ch);
    $info = iconv('GB2312', 'UTF-8', $output); //因为是js调用 所以接收到的信息为字符串，注意编码格式

    return get_between($info, "('", "',");
}

function get_between($input, $start, $end)
{
    return substr($input, strlen($start) + strpos($input, $start), (strlen($input) - strpos($input, $end)) * (-1));
}

function getWeekTwo($value)
{
    return match (intval($value)) {
        1 => '一',
        2 => '二',
        3 => '三',
        4 => '四',
        5 => '五',
        6 => '六',
        default => '日'
    };
}

function handleImg($src)
{
    if (empty($src)) {
        return '';
    }
    if (is_array($src)) {
        foreach ($src as &$v) {
            $v = request()->domain() . $v;
        }

        return $src;
    } else {

        return request()->domain() . $src;
    }
}

function filter_Emoji($str)
{
    $str = preg_replace_callback(    //执行一个正则表达式搜索并且使用一个回调进行替换
        '/./u',
        function (array $match) {
            return strlen($match[0]) >= 4 ? '' : $match[0];
        },
        $str);

    return $str;
}

function imageToBase64($imageUrl)
{
    // 获取远程图片内容
    $imageData = file_get_contents($imageUrl);
    if ($imageData === false) {
        return false;
    }
    // 转换为Base64
    $base64Image = base64_encode($imageData);
    // 输出Base64字符串（可选：添加数据类型前缀）
    $imageType = pathinfo($imageUrl, PATHINFO_EXTENSION); // 获取图片扩展名
    $mime = 'image/' . ($imageType === 'jpg' ? 'jpeg' : $imageType); // 处理jpg/jpeg特殊情况
    $base64WithPrefix = "data:$mime;base64,$base64Image";

    return $base64WithPrefix;
}

/**
 * 日期间隔天数
 */
function dateInterval($date1, $date2)
{
    $datetime1 = new DateTime($date1);
    $datetime2 = new DateTime($date2);
    $interval = $datetime1->diff($datetime2);
    $day = $interval->days;

    return $day;
}

/**
 * 清除文件
 */
function deldir($path)
{
    //如果是目录则继续
    if (is_dir($path)) {
        //扫描一个文件夹内的所有文件夹和文件并返回数组
        $files = scandir($path);
        foreach ($files as $val) {
            //排除目录中的.和..
            if ($val != "." && $val != "..") {
                //如果是目录则递归子目录，继续操作
                if (is_dir($path . $val)) {
                    //子目录中操作删除文件夹和文件
                    deldir($path . $val . '/');
                    //目录清空后删除空文件夹
                    @rmdir($path . $val . '/');
                } else {
                    //如果是文件直接删除
                    unlink($path . $val);
                }
            }
        }
    }
}

/**
 * 格式化数字
 */
function float_number($number)
{
    $suffix = '';
    if (abs($number) >= 10000 && abs($number) < 100000000) {
        $number = round($number / 10000, 1);
        $suffix = '万';
    } elseif (abs($number) >= 100000000) {
        $number = round($number / 100000000, 1);
        $suffix = '亿';
    }

    return $number . $suffix;
}

/**
 * 格式化富文本内容
 */
function handleRichText($content)
{
    if (!empty($content)) {
        $url = request()->domain();
        $content = str_replace('/static/', $url . '/static/', $content);
        $content = str_replace('/uploads/', $url . '/uploads/', $content);
        $content = htmlspecialchars_decode($content);

        return str_replace('\\', '', $content);
    } else {
        return $content;
    }
}

/**
 * 左右区固定基数根据比例对碰
 */
function collision($base, $rate, $left, $right)
{
    $i = 1;
    $num = 0;
    $max_base = $base * $rate;
    while ($i > 0) {
        $number = [$left, $right];
        rsort($number);
        if ($number[0] <= 0 || $number[1] <= 0) {
            break;
        }
        if ($number[0] < $max_base || $number[1] < $base) {
            break;
        }
        if ($left >= $right) {
            $left -= $max_base;
            $right -= $base;
        } else {
            $left -= $base;
            $right -= $max_base;
        }
        $num++;
    }

    return ['num' => $num, 'left' => $left, 'right' => $right];
}

/**
 * 根据一定数量元素数组随机组合
 */
function randomArray($arr, $length)
{
    shuffle($arr);
    return array_chunk($arr, $length);
}

/**
 * 随机获取数组中一定数量的数据
 */
function getRandomArrayElements($array, $count)
{
    if ($count <= 0) return [];
    shuffle($array);
    $keys = array_rand($array, $count);
    $results = [];
    if ($count > 1) {
        foreach ($keys as $key) {
            $results[] = $array[$key];
        }
    } else {
        $results[] = $array[$keys];
    }

    return $results;
}

/**
 * 截取字符串
 */
function cut_str($str, $len)
{
    if (strlen($str) > $len) {
        $str = mb_substr($str, 0, $len) . '...';
    }

    return $str;
}

/**
 * 隐藏手机号
 */
function hideMobile($mobile)
{
    return preg_replace('/^(\d{3})(\d{4})(\d{4})$/', '\1****\3', $mobile);
}

/*
 * 隐藏姓名
 */
function hideName($name)
{
    $doubleSurname = [
        '欧阳', '太史', '端木', '上官', '司马', '东方', '独孤', '南宫',
        '万俟', '闻人', '夏侯', '诸葛', '尉迟', '公羊', '赫连', '澹台', '皇甫', '宗政', '濮阳',
        '公冶', '太叔', '申屠', '公孙', '慕容', '仲孙', '钟离', '长孙', '宇文', '司徒', '鲜于',
        '司空', '闾丘', '子车', '亓官', '司寇', '巫马', '公西', '颛孙', '壤驷', '公良', '漆雕', '乐正',
        '宰父', '谷梁', '拓跋', '夹谷', '轩辕', '令狐', '段干', '百里', '呼延', '东郭', '南门', '羊舌',
        '微生', '公户', '公玉', '公仪', '梁丘', '公仲', '公上', '公门', '公山', '公坚', '左丘', '公伯',
        '西门', '公祖', '第五', '公乘', '贯丘', '公皙', '南荣', '东里', '东宫', '仲长', '子书', '子桑',
        '即墨', '达奚', '褚师', '吴铭'
    ];
    $surname = mb_substr($name, 0, 2);
    if (in_array($surname, $doubleSurname)) {
        $name = mb_substr($name, 0, 2) . str_repeat('*', (mb_strlen($name, 'UTF-8') - 2));
    } else {
        $name = mb_substr($name, 0, 1) . str_repeat('*', (mb_strlen($name, 'UTF-8') - 1));
    }

    return $name;
}

/**
 * 单字节字符隐藏
 */
function maskString($str, $mask = '*')
{
    $len = strlen($str);
    if ($len <= 2) {
        return $str;
    }
    $first = $str[0];
    $last = $str[$len - 1];

    return $first . str_repeat($mask, $len - 2) . $last;
}

/**
 * 多字节字符隐藏
 */
function maskMultibyteString($str, $mask = '*', $encoding = 'UTF-8')
{
    $len = mb_strlen($str, $encoding);
    if ($len <= 2) {
        return $str;
    }
    $first = mb_substr($str, 0, 1, $encoding);
    $last = mb_substr($str, $len - 1, 1, $encoding);

    return $first . str_repeat($mask, $len - 2) . $last;
}

/**
 * 生成随机会员编号
 */
function generateUserCode($length = 8, $type = 1)
{
    $code = \think\helper\Str::random($length, $type);
    $count = \app\common\model\User::where(['code' => $code])->count();

    return $count ? generateUserCode($length, $type) : $code;
}

/**
 * 回复状态
 */
function getReplyStatus($key = '')
{
    $arr = [
        1 => '未回复',
        2 => '已回复'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 审核状态
 */
function getExamineStatus($key = '')
{
    $arr = [
        1 => '待审核',
        2 => '已通过',
        3 => '已驳回'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 页面位置
 */
function getPosition($key = '')
{
    $arr = [
        1 => '首页'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 消息类型
 */
function getNotifyType($key = '')
{
    $arr = [
        1 => '系统消息',
        2 => '订单消息',
        3 => '个人消息'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 安置位置
 */
function getNodePosition($key = '')
{
    $arr = [
        1 => '左区',
        2 => '右区'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 激活方式
 */
function getActiveType($key = '')
{
    $arr = [
        1 => '实单',
        2 => '空单'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 奖金类型
 */
function getBonusTitle($type)
{
    $arr = [
        1 => '推荐收益',
        2 => '团队收益',
        3 => '平级收益'
    ];
    if ($type == 1) {

        return $arr;
    } else {
        $arrSum = [];
        foreach ($arr as $key => $item) {
            $arrSum['sum_' . $key] = $item;
        }

        return $arrSum;
    }
}

/**
 * 支付方式
 */
function get_pay_way($key)
{
    return empty($key) ? '-' : match ($key) {
        'bank' => '银行卡',
        'wechat' => '微信',
        'alipay' => '支付宝',
        'usdt' => 'USDT',
        'other' => '其它',
        default => \app\common\model\Assets::getFields(3)[$key]
    };
}

/**
 * 订单状态
 */
function getOrderStatus($key = '')
{
    $arr = [
        1 => '待支付',
        2 => '待发货',
        3 => '待收货',
        5 => '已完成',
        6 => '已取消'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 交易类型
 */
function getTradeType($key = '')
{
    $arr = [
        1 => '挂卖',
        2 => '挂买'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 交易状态
 */
function getTradeStatus($key = '')
{
    $arr = [
        1 => '交易中',
        2 => '已完成',
        3 => '已取消'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}

/**
 * 交易订单状态
 */
function getTradeOrderStatus($key = '')
{
    $arr = [
        1 => '待打款',
        2 => '待收款',
        3 => '已完成',
        4 => '已取消',
        5 => '申诉中'
    ];
    if ($key) {
        return !empty($arr[$key]) ? $arr[$key] : "";
    }

    return $arr;
}
